/*
    This file is part of MOOPerformanceAssessment.

    MOOPerformanceAssessment is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    MOOPerformanceAssessment is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with MOOPerformanceAssessment; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    Authors: Thomas Voß, 2007
    Contact: thomas.voss.bochum@googlemail.com
*/

#include <EpsilonIndicator.h>

#include <limits>

double EpsilonIndicator::operator()( const PointSet & a, const PointSet & b )
{
    unsigned i, j, k;

    double epsilon = 0;
    double tmp1, tmp2;

    for( i = 0; i < a.size(); i++ )
    {
	tmp1 = std::numeric_limits<double>::max();

        for( j = 0; j < b.size(); j++ )
        {
            tmp2 = 0;

            for( k = 0; k < a[i].size(); k++ )
            {
                tmp2 = std::max( tmp2,
                                 b[j][k] - a[i][k]
                               );
            }

            tmp1 = std::min( tmp1, tmp2 );
        }

        epsilon = std::max( epsilon, tmp1 );
    }

    return( epsilon );
}

extern "C" IBinaryQualityIndicator * factory() 
{
    return( new EpsilonIndicator() );
}
